package org.feng.utils.redis;

import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * @author by feng
 * @des redisZSet
 * @date 2021/4/27 14:03
 */
@Component
public class RedisZSet extends RedisCommon {
    /**
     * 添加元素
     *
     * @param key
     * @param value
     * @param score
     */
    public void add(Object key, Object value, double score) {
        redisTemplate.opsForZSet().add(key, value, score);
    }

    /**
     * 删除元素
     *
     * @param key
     * @param value
     */
    public void delete(Object key, Object... value) {
        redisTemplate.opsForZSet().remove(key, value);
    }

    /**
     * 修改元素score 没有就新生成一个
     *
     * @param key
     * @param value
     * @param score
     * @return
     */
    public Double incrScore(Object key, Object value, double score) {
        return redisTemplate.opsForZSet().incrementScore(key, value, score);
    }

    /**
     * 获取值分数
     *
     * @param key
     * @param value
     * @return
     */
    public Double getScore(Object key, Object value) {
        return redisTemplate.opsForZSet().score(key, value);
    }

    /**
     * 获取集合长度
     *
     * @param key
     * @return
     */
    public Long size(Object key) {
        return redisTemplate.opsForZSet().zCard(key);
    }

    /**
     * 获取坐标区间得 有序集合  （从小到大）
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<ZSetOperations.TypedTuple<Object>> rangeWithScore(String key, int start, int end) {
        return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
    }

    /**
     * 获取坐标区间得 有序集合  （从大到小）
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<Object> revRange(Object key, int start, int end) {
        return redisTemplate.opsForZSet().reverseRange(key, start, end);
    }

    /**
     * 根据score 获取期间得集合（从小到大）
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    public Set<Object> sortRange(Object key, int min, int max) {
        return redisTemplate.opsForZSet().rangeByScore(key, min, max);
    }

    /**
     * 根据score 获取期间得集合（从大到小）
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    public Set<Object> sortRange(Object key, double min, double max) {
        return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);
    }
}
